package com.itany.mybatis.factory;

import com.itany.mybatis.util.MyBatisUtil;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;

public class ObjectFactory {
    static HashMap<String, Object> map = new HashMap<String, Object>();

    static {
        try (
                InputStream is = ObjectFactory.class
                        .getClassLoader().getResourceAsStream("objs.properties");
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
        ) {
            String s = null;
            while ((s = br.readLine()) != null) {
                // 根据反射创建对象: Class.forName("完整类名").newInstance();
                String[] arr = s.split("=");
                if (arr.length == 2) {
                    Class<?> c = Class.forName(arr[1]);
                    Object obj = null;
                    // 如果是dao接口, 则不创建对象
                    if (c.isInterface()) {
                        obj = c;
                    } else {
                        // 是 service, proxy 实现类 就创建对象
                        obj = c.newInstance();
                    }
                    map.put(arr[0], obj);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 注意: 只能在方法中 调用此方法获取 对象
    // 工厂方法 根据 key 获取 new的对象
    public static <T> T getObj(String key) {
        Object obj = map.get(key);
        // 判断是否是 dao 接口的 Class
        if (obj instanceof Class) {
            // 是 dao接口, 则 使用 MyBatis 工具 获取 dao的实现
            Class daoClass = (Class) obj;
            obj = MyBatisUtil.getSession().getMapper(daoClass);
            MyBatisUtil.getSession().commit();
        }
        return (T) obj;
    }
}
